package com.jt.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.util.ObjectMapperUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import redis.clients.jedis.JedisCluster;

import java.util.UUID;

/**
 * @author 张琪
 * @date 2020/12/15
 * @describe
 */
@Service(timeout = 3000)        // 使用的service是dubbo中的service
public class DubboUserServiceImpl implements DubboUserService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private JedisCluster jedisCluster;

    /**
     * 业务:
     * 1. 将密码进行加密处理
     * 2. 邮箱暂时使用电话代替
     *
     * @param user 前端传入的用户信息
     */

    @Override
    public void saveUser(User user) {
//        1. user对象均为明文, 因此需要对密码进行加密
        byte[] pwds = user.getPassword().getBytes();
//        通过MD5的方法为密码进行加密, 并将其存入数据库中
        String md5pass = DigestUtils.md5DigestAsHex(pwds);
        user.setPassword(md5pass).setEmail(user.getPhone());
        userMapper.insert(user);
    }

    /**
     * 1. 校验用户名和密码是否正确, 不存在直接返回null
     * 2. 动态生成密钥, 将用户信息转化为JSON
     * 3. 将数据保存到redis中7天有效
     * 5. 返回密钥ticket信息
     */
    @Override
    public String findUserByUp(User user) {
        String md5Pass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        user.setPassword(md5Pass);
        // 根据对象中不为空的属性, 当作where条件,
        QueryWrapper queryWrapper = new QueryWrapper(user);
        User userDB = userMapper.selectOne(queryWrapper);
//        判断数据库中是否存在对应的数据
        if (userDB == null) {
            return null;
        }

//        校验成功后表示用户名和密码是正确的, 则开启单点登录操作
//        使用UUID创建新的ticket来唯一标识用户信息, 并将ticket存入cookie并发个用户
        String ticket = UUID.randomUUID().toString().replace("-", "");
        /* 直接转化会暴露一部分身份信息, 因此需要脱敏处理*/
        userDB.setPassword("123456");
        String userJSON = ObjectMapperUtil.toJson(userDB);

//        4. 将数据保存到redis中
        jedisCluster.setex(ticket, 7 * 24 * 60 * 60, userJSON);
        return ticket;
    }
}
